package com.hspedu.list_;

public class LinkedList01 {
    public static void main(String[] args) {
        // 模拟一个简单的双向链表
        Node jack = new Node("jack");
        Node tom = new Node("tom");
        Node ljt = new Node("ljt");

        // 链接三个结点，形成双向链表
        // jack -> tom -> ljt
        jack.next = tom;
        tom.next = ljt;
        // ljt -> tom -> jack
        tom.pre = jack;
        ljt.pre = tom;

        // 让 first 引用指向 jack，就是双向链表的头结点
        Node first = jack;
        // 让 last 引用指向 ljt，就是双向链表的尾结点
        Node last = ljt;

        // 演示从头到尾进行遍历
        System.out.println("===从头到尾进行遍历===");
        while (true) {
            if (first == null) {
                first = jack;
                break;
            }
            // 输出 first 信息
            System.out.println(first);
            first = first.next;
        }

        // 演示从尾到头进行遍历
        System.out.println("===从尾到头进行遍历===");
        while (true) {
            if (last == null) {
                last = ljt;
                break;
            }
            // 输出 last 信息
            System.out.println(last);
            last = last.pre;
        }

        // 演示链表 添加/删除 数据是多么方便
        // 在 tom 和 ljt 之间插入一个 对象 smith
        Node smith = new Node("smith");
        tom.next = smith;
        smith.next = ljt;
        ljt.pre = smith;
        smith.pre = tom;
        System.out.println("===从头到尾进行遍历===");
        while (true) {
            if (first == null) {
                first = jack;
                break;
            }
            // 输出 first 信息
            System.out.println(first);
            first = first.next;
        }
        System.out.println("===从尾到头进行遍历===");
        while (true) {
            if (last == null) {
                last = ljt;
                break;
            }
            // 输出 last 信息
            System.out.println(last);
            last = last.pre;
        }
    }
}


// 定义一个 Node 类，表示双向链表的一个结点
class Node {
    public Object item;// 真正存放数据
    public Node next;// 指向后一个结点
    public Node pre;// 指向前一个结点

    public Node(Object name) {
        this.item = name;
    }

    @Override
    public String toString() {
        return "Node name = " + item;
    }
}